<?php
//permet de faire le mapping objet-relationnel des clients objet<-->client bd //-> pattern DAO (Data Access object) cf. Core J2EE Patterns 
Class ClientDAOMysql implements iDAO{
	
	//la connexion et la table consideree
	protected $connexion;
	protected $table='client';
	protected $utilisateurDAO;
	
	public function __construct (){
	//on recupere la connexion puis on va instancier notre DAO utilisateur (les clients et utilsateurs etant  lie)
		$this->connexion=Connexion::getInstance()->getConnexion();
		$DAOfactory=AbstractDAOFactory::getDaoFactory(AbstractDAOFactory::MYSQL);
		$this->utilisateurDAO=$DAOfactory->getUtilisateurDAO();
	}
	
	// on recupere tous les clients
	public function getAll(){
	  $sql = "SELECT * FROM client,utilisateur WHERE client.ID_UTILISATEUR=utilisateur.ID";
	  return $this->executeQuery($sql);
	}
	// on recupere un client par son id
	public function getById($id){
	  $sql = "SELECT * FROM client,utilisateur WHERE client.ID_UTILISATEUR=utilisateur.ID AND ID=".$id;
	  return $this->executeQuery($sql);
	}
	// on recupere un client par son nom
	public function getByName($nom){
	  $sql = "SELECT * FROM client,utilisateur WHERE client.ID_UTILISATEUR=utilisateur.ID WHERE NOM LIKE '%".$nom."%'";
	  return $this->executeQuery($sql);
	}
	
	//ici on execute une requete de type select et on renvoie un tableau composé d'objets
	public function executeQuery($sql) {
		
		$TabObjets = array();
        $result =$this->connexion->query($sql);
		$this->throwExceptionOnError();
		
		
		 if($result) {
           while($row = $result->fetch_object()){
					//on effectue le mapping entre nos objets et les données de la base
                	$client = new Client();
                	$client->setId($row->ID);
					//le stripslashes est utilise en reponse au addSlashes de la  classe HttpRequest
                	$client->setNom(stripslashes($row->NOM));
					$client->setPrenom(stripslashes($row->PRENOM));
					$client->setLogin(stripslashes($row->LOGIN));
					$client->setMotDePasse(stripslashes($row->MOT_PASSE));
					$client->setTelephone(stripslashes($row->TELEPHONE));
					$client->setEmail(stripslashes($row->E_MAIL));
					$client->setAdresse(stripslashes($row->ADRESSE));
					$client->setVille(stripslashes($row->VILLE));
					$client->setCodePostal($row->CODE_POSTAL);
					$client->setSexe(stripslashes($row->SEXE));
					$TabObjets[]=$client;
			}
		}
		
		return $TabObjets;
	}

	public function research($client)
	{
	//permet de verifier la presence du client ds la bdd fonction general utilsable en mode update et en mode insert
		$Tab=array();
		$sql = "SELECT * FROM client,utilisateur WHERE client.ID_UTILISATEUR=utilisateur.ID AND LOGIN='".$client->getLogin()."'";
		$Tab=$this->executeQuery($sql);
	
		switch (count($Tab)){
			// si on est en mode insert "0" siginifie qu'il n'y a pas d'enregistrement donc qu' on peut inserer
			case 0:
					return true;
					break;
			
			case 1:
				// si on est en mode insert l'id de l'objet vaut obligatoirement -1 donc la on est en mode update si client->getId()=TAB->getId() ca veut dire qu'on est sur le bon enregistrement
				if ($client->getId()==$Tab[0]->getId()){
					return true;
					break;
				}
				//sinon on renvoie false
				else{
					return false;
					break;
				}
			
			default:
					return false;
					break;
		}
	}
	
	
	//permet de faire un update ou un insert selon le contexte
	public function save($client) {
		
		If ($client->getId()!=-1){
			$this->update($client);
		}
		else{
			$this->insert($client);
		}
	}
	
//methode permettant de modifier un tuple de la table
	public function update($client) {
		//on cree artificiellement un utilsateur afin de mettre a jour dans les 2 tables (utilisateur et client)
		$utilisateur=new Utilisateur();
		$utilisateur->setId($client->getId());
		$utilisateur->setNom($client->getNom());
		$utilisateur->setPrenom($client->getPrenom());
		$utilisateur->setLogin($client->getLogin());
		$utilisateur->setMotDePasse($client->getMotDePasse());
		$utilisateur->setTypeUtilisateur('client');
		//on update dans la table utilisateur
		$this->utilisateurDAO->update($utilisateur);
		
		$sql="UPDATE ".$this->table." SET TELEPHONE=?, E_MAIL=?, ADRESSE=?, VILLE=?, CODE_POSTAL=?, SEXE=? WHERE ID_UTILISATEUR=?";
		//on prepare la requete
			$stmt = $this->connexion->prepare($sql);
			//on rempli avec les parametres necessaires à la requete parametree
			$stmt->bind_param('ssssisi', $client->getTelephone(), $client->getEmail(), $client->getAdresse(), $client->getVille(),$client->getCodePostal(),$client->getSexe(),$client->getId());
         	//execution de la requete
			$stmt->execute();
			$this->throwExceptionOnError();
		
	}
	
	//methode permettant d'ajouter un enregistrement
	public function insert($client) {
	
		//on cree artificiellement un utilsateur afin d'inserer dans les 2 tables (utilisateur et client)
		$utilisateur=new Utilisateur();
		$utilisateur->setNom($client->getNom());
		$utilisateur->setPrenom($client->getPrenom());
		$utilisateur->setLogin($client->getLogin());
		$utilisateur->setMotDePasse($client->getMotDePasse());
		$utilisateur->setTypeUtilisateur('client');
		$iduser=$this->utilisateurDAO->insert($utilisateur);
		//la requete preparee
		$sql="INSERT INTO ".$this->table." (ID_UTILISATEUR,TELEPHONE, E_MAIL ,ADRESSE, VILLE, CODE_POSTAL , SEXE) VALUES(?,?,?,?,?,?,?)";
		$stmt = $this->connexion->prepare($sql);
		//le remplissage des parametres necessaire à la requete
		$stmt->bind_param('issssis', $iduser , $client->getTelephone(), $client->getEmail(), $client->getAdresse() ,$client->getVille(),$client->getCodePostal(),$client->getSexe());
		//execution de la requete
		$stmt->execute();
		$this->throwExceptionOnError();
		//on retourne l'id inseré en base a la fonction appelante
	    return $iduser;
	
	}
	
	//methode de supression d'un enregistrement
	//ici on appelle un autre DAO (utilisateurDAO)
	public function delete($id){
		//avec les contraintes d'integrite si on supprime l'utilisateur on supprime egalement les données client
		$this->utilisateurDAO->delete($id);
		
		
	}

	
	
	//si quelque chose c'est mal passé
	private function throwExceptionOnError(){
	
		if($this->connexion->error){
			throw new Exception('Erreur mysql'.$this->connexion->error);
		}
	}
	
	
}

?>